package space.misiro.ledgers.keycloak.client.config

import jakarta.annotation.PostConstruct
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration

/**
 * Keycloak客户端和SMTP服务器的统一配置类
 *
 * 负责从应用配置中加载Keycloak认证服务器参数、管理员凭证、客户端配置，
 * 以及邮件服务器相关配置，并将邮件参数整合为统一数据结构
 */
@Configuration
class KeycloakClientConfig {
    /** Keycloak主领域名称，默认值为master */
    var masterRealm: String = "master"

    /** Keycloak认证服务器地址，对应配置项keycloak.auth-server-url */
    @Value("\${keycloak.auth-server-url:}")
    lateinit var authServerUrl: String

    /** Keycloak管理员用户名，对应配置项keycloak-sync.admin.username */
    @Value("\${keycloak-sync.admin.username}")
    lateinit var username: String

    /** Keycloak管理员密码，对应配置项keycloak-sync.admin.password */
    @Value("\${keycloak-sync.admin.password}")
    lateinit var password: String

    /** Keycloak管理客户端ID，默认使用DEFAULT_ADMIN_CLIENT常量值 */
    @Value("\${keycloak.resource:$DEFAULT_ADMIN_CLIENT}")
    lateinit var adminClient: String

    /** 外部客户端ID，对应配置项keycloak.resource */
    @Value("\${keycloak.resource}")
    lateinit var externalClientId: String

    /** 客户端密钥，对应配置项keycloak.credentials.secret */
    @Value("\${keycloak.credentials.secret:}")
    lateinit var clientSecret: String

    /** 客户端所属领域，对应配置项keycloak.realm */
    @Value("\${keycloak.realm}")
    lateinit var clientRealm: String

    /** 是否为公共客户端，对应配置项keycloak.public-client，默认false */
    @Value("\${keycloak.public-client}")
    var publicClient: Boolean = false

    // region SMTP配置参数
    @Value("\${spring.mail.host:}")
    lateinit var emailHost: String

    @Value("\${spring.mail.port:}")
    lateinit var emailPort: String

    @Value("\${spring.mail.username:}")
    lateinit var emailUser: String

    @Value("\${spring.mail.password:}")
    lateinit var emailPassword: String

    /** SMTP认证开关，默认false */
    @Value("\${spring.mail.properties.smtp.auth:false}")
    lateinit var emailAuth: String

    /** SSL加密开关，默认false */
    @Value("\${spring.mail.properties.smtp.ssl:false}")
    lateinit var emailSsl: String

    /** STARTTLS加密协议开关，默认false */
    @Value("\${spring.mail.properties.smtp.start-tls:false}")
    lateinit var startTls: String

    @Value("\${spring.mail.properties.smtp.from:}")
    lateinit var emailFrom: String

    @Value("\${spring.mail.properties.smtp.envelope-from:}")
    lateinit var envelopeFrom: String

    @Value("\${spring.mail.properties.smtp.from-display-name:}")
    lateinit var emailFromDisplayName: String

    @Value("\${spring.mail.properties.smtp.reply-to:}")
    lateinit var replyTo: String

    @Value("\${spring.mail.properties.smtp.reply-to-display-name:}")
    lateinit var replyToDisplayName: String
    // endregion

    /** SMTP服务器配置集合，通过PostConstruct初始化 */
    var smtpServer: MutableMap<String, String> = HashMap();

    /**
     * 初始化SMTP配置参数
     *
     * 在Bean初始化阶段将分散的邮件配置参数整合到smtpServer字典中，
     * 便于后续统一访问和管理邮件服务器配置
     */
    @PostConstruct
    fun doInit() {
        smtpServer["host"] = emailHost
        smtpServer["port"] = emailPort
        smtpServer["user"] = emailUser
        smtpServer["password"] = emailPassword
        smtpServer["auth"] = emailAuth
        smtpServer["ssl"] = emailSsl
        smtpServer["starttls"] = startTls
        smtpServer["from"] = emailFrom
        smtpServer["fromDisplayName"] = emailFromDisplayName
        smtpServer["envelopeFrom"] = envelopeFrom
        smtpServer["replyTo"] = replyTo
        smtpServer["replyToDisplayName"] = replyToDisplayName
    }

    companion object {
        /** 默认的Keycloak管理客户端ID常量 */
        const val DEFAULT_ADMIN_CLIENT: String = "admin-cli"
    }
}
